home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 4 / Apprentice-Release4.iso / Languages / Caml Light 0.7 / Caml Light 0.7 source / src / yacc / main.c < prev    next >
C/C++ Source or Header  |  1995-06-10  |  7KB  |  389 lines

  1. #include <signal.h>
  2. #include "defs.h"
  3.  
  4. char dflag;
  5. char lflag;
  6. char rflag;
  7. char tflag;
  8. char vflag;
  9. char sflag;
  10. char big_endian;
  11.  
  12. char *file_prefix = 0;
  13. char *myname = "yacc";
  14. #ifdef NO_UNIX
  15. char temp_form[] = "yacc.X";
  16. #else
  17. char temp_form[] = "yacc.XXXXXXX";
  18. #endif
  19.  
  20. int lineno;
  21. int outline;
  22.  
  23. char *action_file_name;
  24. char *entry_file_name;
  25. char *code_file_name;
  26. char *interface_file_name;
  27. char *defines_file_name;
  28. char *input_file_name = "";
  29. char *output_file_name;
  30. char *text_file_name;
  31. char *union_file_name;
  32. char *verbose_file_name;
  33.  
  34. FILE *action_file;    /*  a temp file, used to save actions associated    */
  35.             /*  with rules until the parser is written        */
  36. FILE *entry_file;
  37. FILE *code_file;    /*  y.code.c (used when the -r option is specified) */
  38. FILE *defines_file;    /*  y.tab.h                        */
  39. FILE *input_file;    /*  the input file                    */
  40. FILE *output_file;    /*  y.tab.c                        */
  41. FILE *text_file;    /*  a temp file, used to save text until all        */
  42.             /*  symbols have been defined                */
  43. FILE *union_file;    /*  a temp file, used to save the union            */
  44.             /*  definition until all symbol have been        */
  45.             /*  defined                        */
  46. FILE *verbose_file;    /*  y.output                        */
  47. FILE *interface_file;
  48.  
  49. int nitems;
  50. int nrules;
  51. int ntotalrules;
  52. int nsyms;
  53. int ntokens;
  54. int nvars;
  55.  
  56. int   start_symbol;
  57. char  **symbol_name;
  58. short *symbol_value;
  59. short *symbol_prec;
  60. char  *symbol_assoc;
  61. char **symbol_tag;
  62. char *symbol_true_token;
  63.  
  64. short *ritem;
  65. short *rlhs;
  66. short *rrhs;
  67. short *rprec;
  68. char  *rassoc;
  69. short **derives;
  70. char *nullable;
  71.  
  72. extern char *mktemp();
  73. extern char *getenv();
  74.  
  75.  
  76. done(k)
  77. int k;
  78. {
  79.     if (action_file) { fclose(action_file); unlink(action_file_name); }
  80.     if (entry_file) { fclose(entry_file); unlink(entry_file_name); }
  81.     if (text_file) { fclose(text_file); unlink(text_file_name); }
  82.     if (union_file) { fclose(union_file); unlink(union_file_name); }
  83.     if (output_file && k > 0) {
  84.       fclose(output_file); unlink(output_file_name);
  85.     }
  86.     if (interface_file && k > 0) {
  87.       fclose(interface_file); unlink(interface_file_name);
  88.     }
  89.     exit(k);
  90. }
  91.  
  92.  
  93. void onintr(dummy)
  94.      int dummy;
  95. {
  96.     done(1);
  97. }
  98.  
  99.  
  100. set_signals()
  101. {
  102. #ifdef SIGINT
  103.     if (signal(SIGINT, SIG_IGN) != SIG_IGN)
  104.     signal(SIGINT, onintr);
  105. #endif
  106. #ifdef SIGTERM
  107.     if (signal(SIGTERM, SIG_IGN) != SIG_IGN)
  108.     signal(SIGTERM, onintr);
  109. #endif
  110. #ifdef SIGHUP
  111.     if (signal(SIGHUP, SIG_IGN) != SIG_IGN)
  112.     signal(SIGHUP, onintr);
  113. #endif
  114. }
  115.  
  116.  
  117. usage()
  118. {
  119.     fprintf(stderr, "usage: %s [-vs] [-b file_prefix] filename\n",
  120.             myname);
  121.     exit(1);
  122. }
  123.  
  124. getargs(argc, argv)
  125. int argc;
  126. char *argv[];
  127. {
  128.     register int i;
  129.     register char *s;
  130.  
  131.     if (argc > 0) myname = argv[0];
  132.     for (i = 1; i < argc; ++i)
  133.     {
  134.     s = argv[i];
  135.     if (*s != '-') break;
  136.     switch (*++s)
  137.     {
  138.     case '\0':
  139.         input_file = stdin;
  140.         if (i + 1 < argc) usage();
  141.         return;
  142.  
  143.     case '-':
  144.         ++i;
  145.         goto no_more_options;
  146.  
  147.     case 'b':
  148.         if (*++s)
  149.          file_prefix = s;
  150.         else if (++i < argc)
  151.         file_prefix = argv[i];
  152.         else
  153.         usage();
  154.         continue;
  155.  
  156.     case 'v':
  157.         vflag = 1;
  158.         break;
  159.  
  160.     case 's':
  161.         sflag = 1;
  162.         break;
  163.  
  164.     default:
  165.         usage();
  166.     }
  167.  
  168.     for (;;)
  169.     {
  170.         switch (*++s)
  171.         {
  172.         case '\0':
  173.         goto end_of_option;
  174.  
  175.         case 'v':
  176.         vflag = 1;
  177.         break;
  178.  
  179.         case 's':
  180.         sflag = 1;
  181.         break;
  182.  
  183.         default:
  184.         usage();
  185.         }
  186.     }
  187. end_of_option:;
  188.     }
  189.  
  190. no_more_options:;
  191.     if (i + 1 != argc) usage();
  192.     input_file_name = argv[i];
  193.     if (file_prefix == 0) {
  194.       int len;
  195.       len = strlen(argv[i]);
  196.       file_prefix = malloc(len + 1);
  197.       if (file_prefix == 0) no_space();
  198.       strcpy(file_prefix, argv[i]);
  199.       while (len > 0) {
  200.         len--;
  201.         if (file_prefix[len] == '.') {
  202.           file_prefix[len] = 0;
  203.           break;
  204.         }
  205.       }
  206.     }
  207. }
  208.  
  209.  
  210. char *
  211. allocate(n)
  212. unsigned n;
  213. {
  214.     register char *p;
  215.  
  216.     p = NULL;
  217.     if (n)
  218.     {
  219.     p = CALLOC(1, n);
  220.     if (!p) no_space();
  221.     }
  222.     return (p);
  223. }
  224.  
  225.  
  226. create_file_names()
  227. {
  228.     int i, len;
  229.     char *tmpdir;
  230.  
  231. #ifdef NO_UNIX
  232.     len = 0;
  233.     i = sizeof(temp_form);
  234. #else
  235.     tmpdir = getenv("TMPDIR");
  236.     if (tmpdir == 0) tmpdir = "/tmp";
  237.     len = strlen(tmpdir);
  238.     i = len + sizeof(temp_form);
  239.     if (len && tmpdir[len-1] != '/')
  240.     ++i;
  241. #endif
  242.  
  243.     action_file_name = MALLOC(i);
  244.     if (action_file_name == 0) no_space();
  245.     entry_file_name = MALLOC(i);
  246.     if (entry_file_name == 0) no_space();
  247.     text_file_name = MALLOC(i);
  248.     if (text_file_name == 0) no_space();
  249.     union_file_name = MALLOC(i);
  250.     if (union_file_name == 0) no_space();
  251.  
  252. #ifndef NO_UNIX
  253.     strcpy(action_file_name, tmpdir);
  254.     strcpy(entry_file_name, tmpdir);
  255.     strcpy(text_file_name, tmpdir);
  256.     strcpy(union_file_name, tmpdir);
  257.  
  258.     if (len && tmpdir[len - 1] != '/')
  259.     {
  260.     action_file_name[len] = '/';
  261.     entry_file_name[len] = '/';
  262.     text_file_name[len] = '/';
  263.     union_file_name[len] = '/';
  264.     ++len;
  265.     }
  266. #endif
  267.  
  268.     strcpy(action_file_name + len, temp_form);
  269.     strcpy(entry_file_name + len, temp_form);
  270.     strcpy(text_file_name + len, temp_form);
  271.     strcpy(union_file_name + len, temp_form);
  272.  
  273.     action_file_name[len + 5] = 'a';
  274.     entry_file_name[len + 5] = 'e';
  275.     text_file_name[len + 5] = 't';
  276.     union_file_name[len + 5] = 'u';
  277.  
  278. #ifndef NO_UNIX
  279.     mktemp(action_file_name);
  280.     mktemp(entry_file_name);
  281.     mktemp(text_file_name);
  282.     mktemp(union_file_name);
  283. #endif
  284.  
  285.     len = strlen(file_prefix);
  286.  
  287.     output_file_name = MALLOC(len + 7);
  288.     if (output_file_name == 0)
  289.     no_space();
  290.     strcpy(output_file_name, file_prefix);
  291.     strcpy(output_file_name + len, OUTPUT_SUFFIX);
  292.  
  293.     code_file_name = output_file_name;
  294.  
  295.     if (vflag)
  296.     {
  297.     verbose_file_name = MALLOC(len + 8);
  298.     if (verbose_file_name == 0)
  299.         no_space();
  300.     strcpy(verbose_file_name, file_prefix);
  301.     strcpy(verbose_file_name + len, VERBOSE_SUFFIX);
  302.     }
  303.  
  304.     interface_file_name = MALLOC(len + 8);
  305.     if (interface_file_name == 0)
  306.     no_space();
  307.     strcpy(interface_file_name, file_prefix);
  308.     strcpy(interface_file_name + len, INTERFACE_SUFFIX);
  309.  
  310. }
  311.  
  312.  
  313. open_files()
  314. {
  315.     create_file_names();
  316.  
  317.     if (input_file == 0)
  318.     {
  319.     input_file = fopen(input_file_name, "r");
  320.     if (input_file == 0)
  321.         open_error(input_file_name);
  322.     }
  323.  
  324.     action_file = fopen(action_file_name, "w");
  325.     if (action_file == 0)
  326.     open_error(action_file_name);
  327.  
  328.     entry_file = fopen(entry_file_name, "w");
  329.     if (entry_file == 0)
  330.     open_error(entry_file_name);
  331.  
  332.     text_file = fopen(text_file_name, "w");
  333.     if (text_file == 0)
  334.     open_error(text_file_name);
  335.  
  336.     if (vflag)
  337.     {
  338.     verbose_file = fopen(verbose_file_name, "w");
  339.     if (verbose_file == 0)
  340.         open_error(verbose_file_name);
  341.     }
  342.  
  343.     if (dflag)
  344.     {
  345.     defines_file = fopen(defines_file_name, "w");
  346.     if (defines_file == 0)
  347.         open_error(defines_file_name);
  348.     union_file = fopen(union_file_name, "w");
  349.     if (union_file ==  0)
  350.         open_error(union_file_name);
  351.     }
  352.  
  353.     output_file = fopen(output_file_name, "w");
  354.     if (output_file == 0)
  355.     open_error(output_file_name);
  356.  
  357.     if (rflag)
  358.     {
  359.     code_file = fopen(code_file_name, "w");
  360.     if (code_file == 0)
  361.         open_error(code_file_name);
  362.     }
  363.     else
  364.     code_file = output_file;
  365.  
  366.  
  367.     interface_file = fopen(interface_file_name, "w");
  368.     if (interface_file == 0)
  369.       open_error(interface_file_name);
  370. }
  371.  
  372.  
  373. main(argc, argv)
  374. int argc;
  375. char *argv[];
  376. {
  377.     set_signals();
  378.     getargs(argc, argv);
  379.     open_files();
  380.     reader();
  381.     lr0();
  382.     lalr();
  383.     make_parser();
  384.     verbose();
  385.     output();
  386.     done(0);
  387.     /*NOTREACHED*/
  388. }
  389.